<template>
    <div v-if="modelValue && preview">
        <el-image v-if="typeof modelValue == 'string'" :src="modelValue" fit="cover" class="w-[100px] h-[100px] rounded border mr-2"></el-image>
        <div v-else class="flex flex-wrap">
            <div class="relative mx-1 mb-2 w-[100px] h-[100px]" v-for="(url,index) in modelValue" :key="index">
                <el-icon class="absolute right-[5px] top-[5px] cursor-pointer bg-white rounded-full" style="z-index: 10;" @click="removeImage(url)"><CircleClose /></el-icon>
                <el-image :src="url" fit="cover" class="w-[100px] h-[100px] rounded border mr-2"></el-image>
            </div>
        </div>
    </div>

    <div v-if="preview" class="choose-image-btn" @click="open">
        <el-icon :size="25" class="text-gray-500"><Plus /></el-icon>
    </div>
    <el-dialog
        title="选择图片"
        v-model="dialogVisible"
        width="80%"
        top="5vh">
        
        <el-container class="bg-white rounded" style="height:70vh;">
            <el-header class="image-header">
                <el-button type="primary" size="small" @click="handleOpenCreate">新增图片分类</el-button>
                <el-button type="warning" size="small" @click="handleOpenUpload">上传图片</el-button>
            </el-header>
            <el-container>
                <ImageAside ref="ImageAsideRef" @change="handleAsideChange"/>
                <ImageMain :limit="limit" openChoose ref="ImageMainRef" @choose="handleChoose"/>
            </el-container>
        </el-container>

        <template #footer>
            <span>
                <el-button @click="close">取消</el-button>
                <el-button type="primary" @click="submit">确定</el-button>
            </span>
        </template>
    </el-dialog>
    
</template>
<script setup>
import { ref } from "vue"
import ImageAside from "~/components/ImageAside.vue"
import ImageMain from "~/components/ImageMain.vue"
import { toast } from "~/composables/util";


const dialogVisible = ref(false)

const callbackFunction = ref(null)
const open = (callback = null)=>{
    callbackFunction.value = callback
    dialogVisible.value = true
}
const close = ()=>dialogVisible.value = false


const ImageAsideRef = ref(null)
const handleOpenCreate = ()=>ImageAsideRef.value.handleCreate()

const ImageMainRef = ref(null)
const handleAsideChange = (image_class_id)=> ImageMainRef.value.loadData(image_class_id)

const handleOpenUpload = ()=>ImageMainRef.value.openUploadFile()


const props = defineProps({
    modelValue:[String,Array],
    limit:{
        type:Number,
        default:1
    },
    preview:{
        type:Boolean,
        default:true
    }
})
const emit = defineEmits(["update:modelValue"])

let urls = []
const handleChoose = (e)=>{
   urls = e.map(o=>o.url)
}

const submit = ()=>{
    let value = []
    if(props.limit == 1){
        value = urls[0]
    } else {
        value = props.preview ? [...props.modelValue,...urls] : [...urls]
        if(value.length > props.limit){
            let limit = props.preview ? (props.limit - props.modelValue.length) : props.limit
            return toast("最多还能选择"+ limit + "张")
        }
    }
    if(value && props.preview){
        emit("update:modelValue",value)
    }
    if(!props.preview && typeof callbackFunction.value === "function"){
        callbackFunction.value(value)
    }
    close()
}

const removeImage = (url)=> emit("update:modelValue",props.modelValue.filter(u=> u != url))

defineExpose({
    open
})
</script>
<style>
.image-header{
  border-bottom: 1px solid #eeeeee;
  @apply flex items-center;
}
.choose-image-btn {
    @apply w-[100px] h-[100px] rounded border flex justify-center items-center cursor-pointer hover:(bg-gray-100);
}
</style>